package com.chuxing.system.controller;

import cn.dev33.satoken.stp.StpUtil;
import com.chuxing.config.PermissionsState;
import com.chuxing.config.SecurityRole;
import com.chuxing.domain.ClassInfo;
import com.chuxing.domain.DTO.ClassinfoListDTO;
import com.chuxing.domain.Result;
import com.chuxing.domain.VO.PageResultVO;
import com.chuxing.exception.GenericException;
import com.chuxing.exception.UnauthorizedException;
import com.chuxing.system.service.IClassinfoService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.*;

import java.util.List;

/**
 * 班级信息Controller
 * 
 * @author 刘祺
 * @date 2024-12-13
 */
@RestController
@RequestMapping("/system/classinfo")
@Tag( name = "班级信息服务", description = "班级信息服务相关接口")
@RequiredArgsConstructor
public class ClassinfoController
{
    private static final Logger log = LoggerFactory.getLogger(ClassinfoController.class);

    private final IClassinfoService classinfoService;

    /**
     * 查询班级信息列表
     */
    @Operation(summary = "查询班级信息列表", description = "查询班级信息列表")
    @GetMapping("/list")
    public Result<PageResultVO> list(ClassinfoListDTO classinfoListDTO)
    {
        log.info("查询班级信息列表{}", classinfoListDTO);
        // 检查用户是否已登录
        if (!StpUtil.isLogin()) {
            throw new UnauthorizedException(PermissionsState.NOT_LOGIN);
        }
        PageResultVO list = classinfoService.selectClassinfoList(classinfoListDTO);
        return Result.success( "获取班级信息列表成功", list);
    }

    /**
     * 导出班级信息列表
     */
//    @PostMapping("/export")
//    public void export(HttpServletResponse response, ClassInfo classinfo)
//    {
//        List<ClassInfo> list = classinfoService.selectClassinfoList(classinfo);
//        ExcelUtil<ClassInfo> util = new ExcelUtil<ClassInfo>(ClassInfo.class);
//        util.exportExcel(response, list, "班级信息数据");
//    }

    /**
     * 获取班级信息详细信息
     */
    @Operation(summary = "管理员获取班级信息详细信息", description = "管理员根据班级信息ID获取详细信息")
    @GetMapping(value = "/{id}")
    public Result<ClassInfo> getInfo(@PathVariable("id") Long id)
    {
        log.info("获取班级信息详细信息，参数为：{}", id);
        // 检查用户是否已登录
        if (!StpUtil.isLogin()) {
            throw new UnauthorizedException(PermissionsState.NOT_LOGIN);
        }
        // 检查用户是否具有管理员角色
        if (!StpUtil.hasRole(SecurityRole.ROLE_ADMIN)) {
            throw new GenericException(PermissionsState.PERMISSION_NOT_ENOUGH);
        }
        ClassInfo classinfo = classinfoService.selectClassinfoById(id);
        log.info( "获取班级信息详细信息成功，结果为：{}", classinfo);
        return Result.success( "获取班级信息成功",classinfo);
    }

    /**
     * 新增班级信息
     */
    @Operation(summary = "管理员新增班级信息", description = "管理员新增班级信息")
    @PostMapping
    public Result<Object> add(@RequestBody ClassInfo classinfo)
    {
        log.info("管理员新增班级信息{}", classinfo);
        // 检查用户是否已登录
        if (!StpUtil.isLogin()) {
            throw new UnauthorizedException(PermissionsState.NOT_LOGIN);
        }
        // 检查用户是否具有管理员角色
        if (!StpUtil.hasRole(SecurityRole.ROLE_ADMIN)) {
            throw new GenericException(PermissionsState.PERMISSION_NOT_ENOUGH);
        }
        classinfoService.insertClassinfo(classinfo);
        log.info( "新增班级信息成功");
        return Result.success( "新增班级信息成功");
    }

    /**
     * 修改班级信息
     */
    @Operation(summary = "管理员修改班级信息", description = "管理员修改班级信息")
    @PutMapping
    public Result<Object> edit(@RequestBody ClassInfo classinfo)
    {
        log.info("管理员修改班级信息{}", classinfo);
        // 检查用户是否已登录
        if (!StpUtil.isLogin()) {
            throw new UnauthorizedException(PermissionsState.NOT_LOGIN);
        }
        // 检查用户是否具有管理员角色
        if (!StpUtil.hasRole(SecurityRole.ROLE_ADMIN)) {
            throw new GenericException(PermissionsState.PERMISSION_NOT_ENOUGH);
        }
        classinfoService.updateClassinfo(classinfo);
        log.info( "修改班级信息成功");
        return Result.success( "修改班级信息成功");
    }

    /**
     * 删除班级信息
     */
    @Operation(summary = "管理员删除班级信息", description = "管理员根据班级信息ID删除班级信息")
	@DeleteMapping("/{ids}")
    public Result<Object> remove(@PathVariable Long[] ids)
    {
        log.info("管理员删除班级信息，参数为：{}", ids);
        // 检查用户是否已登录
        if (!StpUtil.isLogin()) {
            throw new UnauthorizedException(PermissionsState.NOT_LOGIN);
        }
        // 检查用户是否具有管理员角色
        if (!StpUtil.hasRole(SecurityRole.ROLE_ADMIN)) {
            throw new GenericException(PermissionsState.PERMISSION_NOT_ENOUGH);
        }
        classinfoService.deleteClassinfoByIds(ids);
        log.info( "删除班级信息成功");
        return Result.success( "删除班级信息成功");
    }

    //查询个人班级列表
    @GetMapping("/MessageList")
    public Result<Object> getMessageList()
    {
        // 检查用户是否已登录
        if (!StpUtil.isLogin()) {
            throw new UnauthorizedException(PermissionsState.NOT_LOGIN);
        }
        log.info("查询个人班级列表{}", StpUtil.getLoginIdAsString());
        List<ClassInfo> list = classinfoService.selectClassinfoMessageList(StpUtil.getLoginIdAsString());
        return Result.success( "获取班级信息成功", list);
    }
}
